/* CsJni - .NET / Java Bridge
 * 
 * Copyright 2010 Robert E. Burke Licensed under the Apache License, Version 
 * 2.0 (the "License"); you may not use this file except in compliance with 
 * the License. You may obtain a copy of the License at 
 * http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable 
 * law or agreed to in writing, software distributed under the License is 
 * distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 
 * KIND, either express or implied. See the License for the specific language 
 * governing permissions and limitations under the License. 
*/

using System;
using System.Collections.Generic;
using System.Text;
using CsJni;
using System.Runtime.InteropServices;

namespace JniUnitTests
{
    [JavaToNativeCounterpart("csjni.test.TestMain2")]
    internal sealed class TestMain2
    {
        private TestMain2() { }

        [UnmanagedFunctionPointer(JavaVM.CC)]
        private delegate /* jstring */ IntPtr Reverse_Handler(/* JNIEnv */ IntPtr environmentHandle,
            /* jobject */ IntPtr selfHandle, /* jstring */ IntPtr inputHandle);

        [NativeMethodInfo("reverse", "(Ljava/lang/String;)Ljava/lang/String;", typeof(Reverse_Handler))]
        private static /* jstring */ IntPtr Reverse(/* JNIEnv */ IntPtr environmentHandle,
            /* jobject */ IntPtr selfHandle, /* jstring */ IntPtr inputHandle)
        {
            JniEnvironment environment = JavaVM.EnvironmentFromHandle(environmentHandle);
            try
            {
                String input = (IntPtr.Zero == inputHandle) ? null : JniString.ExtractStringFromHandle(environment, inputHandle);
                char[] chars = input.ToCharArray();
                Array.Reverse(chars);
                String output = new String(chars);
                return JniString.NewStringCore(environment, output);
            }
            catch (JniThrowableException ex)
            {
                ex.Throwable.ThrowToJavaVM(environment);
                return IntPtr.Zero; // does not matter to Java code
            }
            catch (Exception ex)
            {
                JniThrowable.ThrowDotNetExceptionToJavaVM(environment, ex);
                return IntPtr.Zero; // does not matter to Java code
            }
        }
    }
}
